﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Controls;

namespace Client.Validaciones
{
    class StringValidacion : ValidationRule
    {
        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
        {
            string valor;
            int numero;
            MensajesError error = new MensajesError();


            valor = value.ToString();

            if (!String.IsNullOrWhiteSpace(valor))
            {
                if (!Int32.TryParse(valor, out numero))
                {
                    //es un string
                    return new ValidationResult(true, null);
                }

                else
                {
                    //es un numero
                    return new ValidationResult(false, error.NO_ES_STRING);
                }
            }
            else
            {
                return new ValidationResult(false, error.NULO_O_VACIO);
            }

        }
    }

    class EnteroPositivoValidacion : ValidationRule
    {
        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
        {
            int numero;
            string valor;
            MensajesError error = new MensajesError();
            valor = value.ToString();

            if (!String.IsNullOrWhiteSpace(valor))
            {
                if (Int32.TryParse(valor, out numero))
                {
                    if (numero >= 1)
                        return new ValidationResult(true, null);
                    else
                        return new ValidationResult(false, error.NUMERO_NO_NATURAL);

                }
                else
                    return new ValidationResult(false, error.NO_ES_NUMERO);
            }
            else
                return new ValidationResult(false, error.NULO_O_VACIO);
        }
    }

    class EnteroPositivoONuloValidacion : ValidationRule
    {
        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
        {
            int numero;
            string valor;
            MensajesError error = new MensajesError();
            valor = value.ToString();

            if (String.IsNullOrWhiteSpace(valor))
                return new ValidationResult(false, error.NULO_O_VACIO);
            try
            {
                numero = Int32.Parse(valor);
                if (numero >= 1)
                    return new ValidationResult(true, null);
                else
                    return new ValidationResult(false, error.NUMERO_NO_NATURAL);
            }

            catch (FormatException)
            {
                return new ValidationResult(false, error.NO_ES_NUMERO);
            }

        }

    }

    class NoNuloValidacion : ValidationRule
    {
        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
        {
            string valor;
            MensajesError error = new MensajesError();
            valor = value.ToString();

            if (String.IsNullOrWhiteSpace(valor))
                return new ValidationResult(false, error.NULO_O_VACIO);
            else
                return new ValidationResult(true, null);
        }

    }

    class StringONuloValidacion : ValidationRule
    {
        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
        {
            string valor;
            int numero;
            MensajesError error = new MensajesError();


            valor = value.ToString();

            if (!String.IsNullOrWhiteSpace(valor))
            {
                if (!Int32.TryParse(valor, out numero))
                {
                    //es un string
                    return new ValidationResult(true, null);
                }
                else
                {
                    //es un numero
                    return new ValidationResult(false, error.NO_ES_STRING);
                }
            }
            else
            {
                return new ValidationResult(true, null);
            }

        }
    }

    class RUTValidacion : ValidationRule
    {
        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
        {
            string valor;
            string valor2 = "";
            int numero, rut, contador, acumulador, multiplo, digito, i;
            string digitoVerificador = "";
            MensajesError error = new MensajesError();

            contador = 2;
            acumulador = 0;
            valor = value.ToString();

            for (i = valor.Count(); i > 0; i--)
            {
                digitoVerificador = valor.ElementAt(i - 1).ToString();
                if (!String.IsNullOrEmpty(digitoVerificador) && !digitoVerificador.Equals(" "))
                {
                    valor2 = valor.Remove(i - 1); //sin digito verificador
                    break;
                }

            }

            if (!String.IsNullOrWhiteSpace(valor))
            {
                if (Int32.TryParse(valor2, out numero))
                {
                    rut = Int32.Parse(valor2);
                    while (rut != 0)
                    {
                        multiplo = (rut % 10) * contador;
                        acumulador = acumulador + multiplo;
                        rut = rut / 10;
                        contador = contador + 1;
                        if (contador == 8)
                        {
                            contador = 2;
                        }

                    }

                    digito = 11 - (acumulador % 11);

                    if (digito.ToString().Equals(digitoVerificador))
                        return new ValidationResult(true, null);

                    if (digito == 10)
                    {
                        if (digitoVerificador.Equals("K") || digitoVerificador.Equals("k"))
                            return new ValidationResult(true, null);
                    }

                    if (digito == 11)
                    {
                        if (digitoVerificador.Equals("0"))
                            return new ValidationResult(true, null);
                    }

                    return new ValidationResult(false, error.NO_ES_RUT);
                }
                else
                {
                    //no es numero sin digito verificador
                    return new ValidationResult(false, error.NO_ES_RUT);
                }
            }
            else //es vacio
            {
                return new ValidationResult(false, error.NULO_O_VACIO);
            }

        }
    }

    class MoneyValidacion : ValidationRule
    {
        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
        {

            int numero;
            string valor;
            string[] tokens;
            string[] tok;
            MensajesError error = new MensajesError();
            valor = value.ToString();

            if (!String.IsNullOrWhiteSpace(valor))
            {
                tokens = valor.Split(' ');
                if (tokens.Count() > 1)
                {
                    tok = tokens[1].Split('.');
                    valor = "";
                    for (int i = 0; i < tok.Count(); i++)
                    {
                        valor = valor + tok[i];
                    }
                }
                if (Int32.TryParse(valor, out numero))
                {
                    if (numero >= 1)
                        return new ValidationResult(true, null);
                    else
                        return new ValidationResult(false, error.NUMERO_NO_NATURAL);

                }
                else
                    return new ValidationResult(false, error.NO_ES_NUMERO);

            }
            else
                return new ValidationResult(false, error.NULO_O_VACIO);
        }
    }

    class UTMValidacion : ValidationRule
    {
        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
        {

            int numero;
            string valor;
            string[] tokens;
            //string[] tok;
            MensajesError error = new MensajesError();
            valor = value.ToString();

            if (!String.IsNullOrWhiteSpace(valor))
            {
                tokens = valor.Split(' ');
                if (tokens.Count() > 1)
                {
                    valor = tokens[0];
                    Console.WriteLine(valor);
                }
                if (Int32.TryParse(valor, out numero))
                {
                    Console.WriteLine(valor);
                    if (numero >= 1)
                        return new ValidationResult(true, null);
                    else
                        return new ValidationResult(false, error.NUMERO_NO_NATURAL);

                }
                else
                    return new ValidationResult(false, error.NO_ES_NUMERO);

            }
            else
                return new ValidationResult(false, error.NULO_O_VACIO);
        }
    }

    class Largo64Validacion : ValidationRule
    {
        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
        {
            string valor;
            MensajesError error = new MensajesError();
            valor = value.ToString();

            if (valor.Length != 8)
            {
                return new ValidationResult(false, error.LARGO_INCORRECTO);
            }
            else
            {
                //es un string
                return new ValidationResult(true, null);
            }

        }
    }

    class SinEspaciosValidacion : ValidationRule
    {
        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
        {
            string valor;
            MensajesError error = new MensajesError();
            valor = value.ToString();

            foreach (char letra in valor)
            {
                if (letra.Equals(' '))
                {
                    return new ValidationResult(false, error.ESPACIO_ENCONTRADO);
                }
            }
            return new ValidationResult(true, null);
        }
    }


    class MensajesError
    {
        public string NULO_O_VACIO = "Este campo no puede quedar vacío";
        public string NUMERO_NO_NATURAL = "El número ingresado debe ser mayor o igual a 1";
        public string NO_ES_NUMERO = "Debe ingresar un número menor o igual a 2147483647";
        public string NO_ES_STRING = "Debe ingresar texto";
        public string NO_ES_RUT = "Ingrese un RUT válido";
        public string SELECCION_INVALIDA = "La selección es inválida";
        public string LARGO_INCORRECTO = "La clave debe ser de 64 bits (8 caracteres)";
        public string ESPACIO_ENCONTRADO = "La clave no debe contener espacios";
    }
}
